package restWebService;

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.ArrayList;

import javax.ws.rs.Consumes;
import javax.ws.rs.GET;
import javax.ws.rs.POST;
import javax.ws.rs.Path;
import javax.ws.rs.PathParam;
import javax.ws.rs.Produces;
import javax.ws.rs.WebApplicationException;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Response;
import javax.ws.rs.core.StreamingOutput;

import moduloConsulta.algoritmo.AlgoritmoConsulta;
import moduloConsulta.entidades.ResultadoConsulta;
import moduloConsulta.gestores.GestorConsulta;
import moduloIndexacion.gestores.GestorDocumento;
import entidades.Documento;

@Path("/consultasManager")
public class WebService {

	//Para llamar a este servico se debe hacer http://localhost:8080/MotorBusquedaWeb/restManager/consultasManager/consultar/$
	// $ = palabra a buscar
	@GET
	@Path("/consultar/{consulta}")
	@Produces(MediaType.APPLICATION_JSON)
	public ArrayList<ResultadoConsulta> consultar(@PathParam("consulta") String consulta) 
	{
		return GestorConsulta.getInstance().generarConsulta(consulta);
	}
	
	//Para llamar a este servico se debe hacer http://localhost:8080/MotorBusquedaWeb/restManager/consultasManager/archivo/$
	// $ = id del documento
	@GET
	@Path("/archivo/{id}")
	@Produces(MediaType.APPLICATION_OCTET_STREAM)
	public Response obtenerArchivo(@PathParam("id") String id) throws Exception
	{
		Documento doc = new GestorDocumento().getDocumento(Integer.parseInt(id));
		File file = new File(doc.getUbicacion()+"\\"+doc.getNombre());
	    final InputStream inp = new FileInputStream(file);
	    
	    StreamingOutput stream = new StreamingOutput() {
	    	@Override
	        public void write(OutputStream output) throws IOException, WebApplicationException {
	            try {
	            	int numRead;
	                while ( (numRead = inp.read() ) >= 0) {
	                	output.write(numRead);
	                }
	            } catch (Exception e) {
	                throw new WebApplicationException(e);
	            }
	        }
	    };
	    
	    return Response.ok(stream).header("content-disposition","attachment; filename=\""+doc.getNombre()+"\"").build();
	}
	
	//Para llamar a este servico se debe hacer http://localhost:8080/MotorBusquedaWeb/restManager/consultasManager/configuracion
	@GET
	@Path("/configuracion")
	@Produces(MediaType.APPLICATION_JSON)
	public AlgoritmoConsulta obtenerConfiguracion()
	{
		return GestorConsulta.getInstance().getAlgoritmoConsulta();
	}
	
	//Para llamar a este servico se debe hacer http://localhost:8080/MotorBusquedaWeb/restManager/consultasManager/configuracion
	@POST
	@Path("/configuracion")
	@Consumes(MediaType.APPLICATION_JSON)
	@Produces(MediaType.APPLICATION_JSON)
	public AlgoritmoConsulta setearConfiguracion(AlgoritmoConsulta algoritmoConsulta)
	{
		AlgoritmoConsulta ag = GestorConsulta.getInstance().getAlgoritmoConsulta();
		ag.setNroDocDevolver(algoritmoConsulta.getNroDocDevolver());
		ag.setCondicionCorteTf(algoritmoConsulta.getCondicionCorteTf());
		ag.saveParametros();
		return ag;
	}
}
